# -*- coding: utf-8 -*-
"""
@Project ：PMS_AUTO_TEST
@File    ：fun_update_clientinfo.py
@Author  ：何思雨
@Date    ：2021/9/3
"""

import allure
from time import sleep
from common.utils import Utils
from config.config import Config
from dz_service.page_elements.el_update_clientinfo import update_clientinfo
from dz_service.page_elements.el_common import common
from dz_service.function.fun_home import Home
from dz_service.function.fun_common import Common
from common.page import Page
from dz_service.function.fun_service_utils import ServiceUtils


class UpdateClientinfo:
    def switch_check_to_num(self, check):
        '''
        将中文单选框与英文字母进行转义
        @params check_label 中文名称
        '''
        check_label ={
            "中国人民银行征信中心":"0",
            "最高人民法院失信被执行人名单":"1",
            "工商行政管理机构":"2",
            "税务管理机构":"3",
            "监管机构、自律组织":"4",
            "投资者在证券经营机构从事投资活动时产生的违约等失信行为记录":"5",
            "恶意维权等不正当行为":"6",
            "其他":"7",
            "中国税收居民（中国境内有住所，或者无住所而在境内居住满一年的个人）":"8",
            "非居民（中国税收居民以外的个人）":"9",
            "既是中国税收居民又是其他税收管辖区居民（中国境内有住所，同时在外国境内也有住所的个人）":"10"
        }
        return int(check_label.get(check))

    @allure.step('step:作废网厅新中台、BOP业务流水')
    def initial_userinfo(self, client_id):
        ServiceUtils().initial_service_sql(client_id, '1060')
        ServiceUtils().initial_bop_sql(client_id, '1001')

    @allure.step('step:业务办理前置检查')
    def pre_check_clientinfo(self, test_input):
        '''
        业务办理前置检查,包含以下三个模块：
        1.落地引导页
        2.业务准入条件页
        3.客户资料完整性校验页
        '''
        header_info = test_input['header_info']
        introduce_info = test_input['introduce_info']
        access_conditions = test_input['access_conditions']
        complete_information = test_input['complete_information']
        # 点击首页菜单--基本信息修改
        Home().click_update_clientinfo()
        # 落地引导页检查
        Common().check_guide_page(header_info, introduce_info)
        # 准入条件检查页
        Common().check_access_conditions(access_conditions)
        # 完整性检查页
        Common().check_access_conditions(complete_information)

    @allure.step('step:联系地址修改')
    def update_adress(self, test_input):
        '''
        联系地址修改
        @params test_input 测试数据
        '''
        tittle = test_input['address_tittle']
        contactAdd = test_input['contactAdd']
        provice = test_input['provice']
        city = test_input['city']
        zone = test_input['zone']
        Page.check_page_loading(5)
        # 检查页面标题
        ServiceUtils.assert_element([(update_clientinfo, '联系地址', '页面标题', tittle, '打开联系地址修改页面失败。')], log='打开联系地址修改页面成功。')
        # 修改联系地址
        # Page.click(update_clientinfo, '联系地址', '联系地址')
        Page.click(update_clientinfo, '联系地址', '省市区')
        #输入省市区信息
        Page.select_location('homeAddress',provice)
        Page.select_location('homeAddress',city)
        Page.select_location('homeAddress',zone)
        Page.click(update_clientinfo, '联系地址', '取消')
        # 输入门牌号信息
        Page.click(update_clientinfo, '联系地址', '门牌号')
        Page.send_key(update_clientinfo, '联系地址', '门牌号', contactAdd)
        sleep(1)
        # 点击菜单--下一步
        Common().click_next()
        Page.check_page_loading(10)
        # 若弹出联系地址需具体到门牌号确认弹框，则点击确定
        if Page.element_is_exist(update_clientinfo, '联系地址', '联系地址需具体到门牌号确认弹框'):
            sleep(1)
            Page.click(update_clientinfo, '联系地址', '联系地址需具体到门牌号确认按钮')
            Page.logger.info("联系地址需具体到门牌号，本人确认联系地址属实。--已确认", extra={"appname": "update_adress"})
        # 若弹出联系地址为经常居住地确认弹框，则点击确定
        if Page.element_is_exist(update_clientinfo, '联系地址', '联系地址为经常居住地确认弹框'):
            sleep(1)
            Page.click(update_clientinfo, '联系地址', '联系地址需具体到门牌号确认按钮')
            Page.logger.info("请确认联系地址是否为经常居住地。--已确认", extra={"appname": "update_adress"})

    @allure.step('step:学历职业信息修改')
    def update_career_info(self, test_input):
        '''
        学历职业信息修改
        @params test_input 测试数据
        '''
        Page.check_page_loading(10)
        # 检查页面标题
        tittle = test_input['career_tittle']
        degreeCode = test_input['degreeCode']
        professionCode = test_input['professionCode']
        work = test_input['work']
        unit = test_input['unit']
        income = test_input['income']
        ServiceUtils.assert_element([(update_clientinfo, '学历职业信息', '页面标题', tittle, '打开学历职业信息页面失败。')], log='打开学历职业信息修改页面成功。')
        # 若弹出您选择的职业为学生，请确认是否正确确认弹框，则点击重新选择
        if Page.element_is_exist(update_clientinfo, '学历职业信息', '职业为学生确认弹框'):
            sleep(1)
            Page.click(update_clientinfo, '其他信息', '职业为学生确认弹框重新选择')
            Page.logger.info("您选择的职业为学生，请确认。--已重新选择", extra={"appname": "update_career_info"})
        # 修改学历
        Page.click(update_clientinfo, '学历职业信息', '学历')
        Page.clear_select('degreeCode');
        Page.select_location('degreeCode', degreeCode)
        Page.click(update_clientinfo, '公共元素', '完成', is_els=True, num=0)
        # 修改职业
        Page.click(update_clientinfo, '学历职业信息', '职业', is_els=True, num=2)
        Page.clear_select('professionCode');
        Page.select_location('professionCode', professionCode)
        Page.click(update_clientinfo, '公共元素', '完成', is_els=True, num=1)
        # 修改职务
        Page.click(update_clientinfo, '学历职业信息', '职务')
        Page.clear_select('work');
        Page.select_location('work', work)
        Page.click(update_clientinfo, '公共元素', '完成', is_els=True, num=2)
        # 修改工作单位
        sleep(1)
        Page.click(update_clientinfo, '学历职业信息', '工作单位')
        Page.send_key(update_clientinfo, '学历职业信息', '工作单位', unit)
        #修改年收入
        sleep(1)
        Page.click(update_clientinfo, '学历职业信息', '年收入')
        Page.select_list('incomeChoose', income)
        Page.click(common, '公共页面', '确定', is_els=True, num=3)
        # 点击菜单--下一步
        Common().click_next()

    @allure.step('step:其他信息修改')
    def update_other_info(self, test_input):
        '''
        其他信息修改
        @params test_input 测试数据
        '''
        Page.check_page_loading(10)
        # 检查页面标题
        tittle = test_input['other_tittle']
        control_type = test_input['control_type']
        actual_controller = test_input['actual_controller']
        control_relation = test_input['control_relation']
        control_phone = test_input['control_phone']
        beneficial_type = test_input['beneficial_type']
        actual_beneficiary = test_input['actual_beneficiary']
        beneficial_relation = test_input['beneficial_relation']
        beneficial_phone = test_input['beneficial_phone']
        bad_credit_info = test_input['bad_credit_info']
        natural_person_kind = test_input['natural_person_kind']
        bad_credit_flag = test_input['bad_credit_flag']
        # natural_person_info = test_input['natural_person_info']
        ServiceUtils.assert_element([(update_clientinfo, '其他信息', '页面标题', tittle, '打开其他信息修改页面失败。')],
                                    log='打开其他信息修改页面成功。')
        # 修改控制人类型
        Page.click(update_clientinfo, '其他信息', '控制人类型')
        Page.clear_select('controlType');
        Page.select_location('controlType', control_type)
        Page.click(update_clientinfo, '公共元素', '完成', is_els=True, num=0)
        # 修改控制人姓名
        Page.click(update_clientinfo, '其他信息','实际控制人')
        Page.clear_edit("actualControlPerson")
        Page.send_key(update_clientinfo, '其他信息', '实际控制人', actual_controller)
        # 修改与控制人关系
        Page.click(update_clientinfo, '其他信息', '与控制人关系')
        Page.clear_select('actualControlRelation');
        Page.select_location('actualControlRelation', control_relation)
        Page.click(update_clientinfo, '公共元素', '完成', is_els=True, num=1)
        # 修改控制人电话
        Page.click(update_clientinfo, '公共元素', '修改', is_els=True, num=3)
        Page.clear_edit('actualControlPhone');
        Page.send_key(update_clientinfo, '其他信息', '控制人电话', control_phone, is_els=True, num=-1)
        # 修改受益人类型
        Page.clear_select('benefitType');
        Page.click(update_clientinfo, '其他信息', '受益人类型')
        Page.select_location('benefitType', beneficial_type)
        Page.click(update_clientinfo, '公共元素', '完成', is_els=True, num=2)
        # 修改实际受益人姓名
        sleep(1)
        Page.click(update_clientinfo, '其他信息', '实际受益人')
        Page.clear_edit('benefitPerson');
        Page.send_key(update_clientinfo, '其他信息', '实际受益人', actual_beneficiary)
        # 修改与受益人关系
        Page.clear_select('benefitRelation');
        Page.click(update_clientinfo, '其他信息', '与受益人关系')
        Page.select_location('benefitRelation', beneficial_relation)
        Page.click(update_clientinfo, '公共元素', '完成', is_els=True, num=3)
        # 修改受益人电话
        Page.clear_edit('benefitPhone');
        Page.click(update_clientinfo, '公共元素', '修改', is_els=True, num=8)
        Page.send_key(update_clientinfo, '其他信息', '受益人电话', beneficial_phone, is_els=True, num=1)
        # 修改不良诚信记录
        Page.clear_select('honesty');
        Page.click(update_clientinfo, '其他信息', '不良诚信记录')
        Page.select_location('honesty', bad_credit_flag)
        Page.click(update_clientinfo, '公共元素', '完成', is_els=True, num=4)
        sleep(1)
        Page.js_bottom()
        Page.click(update_clientinfo, '其他信息', '不良诚信记录单选框', is_els=True, num=self.switch_check_to_num(bad_credit_info))
        sleep(1)
        # 修改自然人身份类别
        Page.clear_select('identityCategory');
        Page.click(update_clientinfo, '其他信息', '自然人身份类别')
        Page.select_location('identityCategory', natural_person_kind)
        Page.click(update_clientinfo, '公共元素', '完成', is_els=True, num=5)
        sleep(1)
        Page.js_bottom()
        # 居民身份申报
        # Page.click(update_clientinfo, '其他信息', '不良诚信记录单选框', is_els=True, num=self.switch_check_to_num(natural_person_info))
        # 点击菜单--下一步
        Common().click_next()
        # 若弹出实控人非本人确认弹框，则点击确定
        if Page.element_is_exist(update_clientinfo, '其他信息', '实控人非本人确认弹框'):
            sleep(1)
            Page.click(update_clientinfo, '公共元素', '确定')
            Page.logger.info("根据账户实名制相关规定，账户不得出借给他人使用，请确认账户实际控制人是否为非本人。注意：如账户实际控制人为非本人，我司将对账户进行······--已确认", extra={"appname": "update_other_info"})

    @allure.step('step:第二联系人相关信息及其他信息修改')
    def update_second_contact_info(self, test_input):
        '''
        第二联系人相关信息修改
        @params test_input 测试数据
        '''
        Page.check_page_loading(10)
        name = test_input['name']
        phone = test_input['phone']
        home_phone = test_input['home_phone']
        relation = test_input['relation']
        # cancel_account_way = test_input['cancel_account_way']
        tittle = test_input['second_contact_tittle']
        ServiceUtils.assert_element([(update_clientinfo, '第二联系人相关信息', '页面标题', tittle, '打开第二联系人相关信息修改页面失败。')],
                                log='打开第二联系人相关信息修改页面成功。')
        #修改姓名
        Page.click(update_clientinfo, '第二联系人相关信息', '姓名')
        Page.clear_edit("secondContact")
        Page.send_key(update_clientinfo, '第二联系人相关信息', '姓名', name, is_els=True, num=0)
        #修改电话
        Page.clear_edit('secondContactPhone')
        Page.click(update_clientinfo, '公共元素', '修改', is_els=True, num=1)
        Page.send_key(update_clientinfo, '第二联系人相关信息', '电话', phone, is_els=True, num=1)
        #修改与本人关系
        Page.click(update_clientinfo, '第二联系人相关信息', '与本人关系')
        Page.select_location('relationship', relation)
        Page.click(update_clientinfo, '公共元素', '完成')
        #修改家庭电话
        Page.clear_edit('homeTel')
        Page.click(update_clientinfo, '公共元素', '修改', is_els=True, num=4)
        Page.send_key(update_clientinfo, '第二联系人相关信息', '家庭电话', home_phone, is_els=True, num=1)
        #修改销户方式，增加见证销户
        Page.click(update_clientinfo, '第二联系人相关信息', '销户方式')
        Page.click(update_clientinfo, '第二联系人相关信息', '见证销户')
        #点击下一步
        Common().click_next()
        # 若弹出一人多户同步弹窗提示，则点击确定
        Common().check_dialog()

    @allure.step('step:检查大字段表中客户资料修改数据')
    def check_update_clientinfo(self, test_input):
        '''
           大字段表中数据校验
           @params test_input 测试数据
           '''
        if Config().env == 'test':
            client_id = test_input['client_id']
            control_phone = test_input['control_phone']
            actual_controller = test_input['actual_controller']
            beneficial_relation = test_input['beneficial_relation']
            professionCode = test_input['professionCode']
            income = test_input['income']
            control_relation = test_input['control_relation']
            degreeCode = test_input['degreeCode']
            name = test_input['name']
            home_phone = test_input['home_phone']
            search_result = Utils.search_client(client_id)
            Page.logger.info(search_result, extra={'appname': 'check_update_clientinfo'})
            Utils.check_val(client_id, search_result['clientId'], "客户号")
            Utils.check_val(income, search_result['income'], "年收入")
            Utils.check_val(control_relation, search_result['sjkzrRelation'], "实际控制人与本人关系")
            Utils.check_val(degreeCode, search_result['degreeCode'], "学历")
            Utils.check_val(name, search_result['secRelationName'], "第二联系人姓名")
            Utils.check_val(actual_controller, search_result['controlPerson'], "实际控制人姓名")
            Utils.check_val(control_phone, search_result['controllerTel'], "实际控制人电话")
            Utils.check_val(beneficial_relation, search_result['sjsyrRelation'], "实际受益人与本人关系")
            Utils.check_val(home_phone, search_result['homeTel'], "家庭电话")
            Utils.check_val(professionCode, search_result['professionCode'], "职业代码")

        else:
            assert True
